VMware Cloud on AWSの仮想マシン情報をLambdaで取得してみた
こんにちは、AWS事業本部の荒平(@0Air)です。
VMware Cloud on AWSを使っていると、仮想マシンの一覧を取得したくなることがしばしばあります。
リソースの計算であったり、運用管理上のタスクであったり、取得するタイミングは様々あると思いますが、Lambdaから取得できるようにしておけば、ローカルマシンの環境に左右されず、定期実行もできたり嬉しいことがあります。
今回はそれを実装します。
構成図
本エントリで紹介する構成図です。
Lambda VPCを使い、NAT Gateway(Elastic IP)を経由することでvSphereへのアクセスを制御します。
用意した検証環境の都合上、VMware Cloud on AWSとLambdaのアカウントは別になっていますが、同一アカウントでも問題なく利用できます。
実装方法
紹介する実装手順は以下の通りです。
- vCenter情報の確認
- Lambdaレイヤーの作成
- Lambda関数の作成
- Lambda関数の権限、VPC設定
- VMware Cloud on AWSのファイアウォール(NSX)設定
(1) vCenter情報の確認
VMware Cloud on AWSの仮想マシン情報を得るためには、vCenterへのアクセスを行います。
VMCコンソールから、SDDCの情報を確認し、[設定]タブより vCenter Server FQDN(またはIPアドレス)を控えておきます。
(2) Lambdaレイヤーの作成
pyVim, pyVmomiのLambdaレイヤーを作成します。
以下に示すコードはUbuntu上で作成するものなので、各OSによって読み替えてください。
mkdir -p lambda_layer/python/lib/python3.10/site-packages python3 -m venv venv source venv/bin/activate pip install pyVim pyVmomi deactivate cp -R venv/lib/python3.10/site-packages/* lambda_layer/python/lib/python3.10/site-packages/ cd lambda_layer zip -r ../layer.zip .
作成した layer.zip
をLambdaレイヤーとしてアップロードします。
※ 私のようにローカルでレイヤーを作成しなかった場合は、scp
コマンドなどで一旦ファイルを手元に置きます。
(3) Lambda関数の作成
Lambda関数をPythonで新規作成し、コードソース部に以下のコードを記述します。
from pyVim import connect from pyVmomi import vmodl from pyVmomi import vim def lambda_handler(event, context): host = event['host'] user = event['user'] password = event['password'] try: service_instance = connect.SmartConnect(host=host, user=user, pwd=password) content = service_instance.RetrieveContent() container = content.viewManager.CreateContainerView(content.rootFolder, [vim.VirtualMachine], True) for entity in container.view: print("Name: ", entity.name) print("Power state: ", entity.runtime.powerState) connect.Disconnect(service_instance) except vmodl.MethodFault as error: print(f"Caught vmodl fault: {error.msg}") return 1 return 0
このコードではvCenterのホスト名、ユーザー名、パスワードはイベントで渡す仕組みにしているので、以下のようにイベントを作成して認証情報を渡します。
{ "host": "vcenter.sddc-xxx-xxx-xxx-xxx.vmwarevmc.com", "user": "cloudadmin@vmc.local", "password": "xxxxxxxxxxxxxxxx" }
[カスタムレイヤー]を選択して、前手順で作成したレイヤーを関数に追加します。
(4) Lambda関数の権限、VPC設定
vCenterへの管理ゲートウェイアクセスを実施するためには、IP経路の制御が必要であるため、今回はVPCのNAT Gatewayを経由してアクセスするように設定します。
そのため、Lambda関数のロールには、AWSLambdaVPCAccessExecutionRole
のマネージドルールを追加します。
関数内の[VPC]タブから、「編集」をクリックします。
NATゲートウェイにルーティングのあるプライベートサブネットを指定してVPCに接続します。
ウィザード中にも書いていますが、関数がインターネット接続を行うためにはこのルーティングが必要です。
また、このとき(実行するオペレーションにもよりますが)タイムアウト値を十分な長さに調整しておきます。
ここまで出来れば、AWS側の設定操作は終了です。
(5) VMware Cloud on AWSのファイアウォール(NSX)設定
NSXの設定画面を開き、VPC Lambda (via NAT Gateway)からの通信許可ルールを作成します。
([セキュリティ] - [ゲートウェイ ファイアウォール] - [管理ゲートウェイ])
設定項目
- 名前
- 送信元
- Lambdaが経由するNAT GatewayのEIP
- 宛先
- vCenter
- サービス
- HTTPS
[発行]をクリックして設定を反映します。
実行結果
それでは、認証情報のイベントと共に実行してみます。
狙い通り、vCenterに登録されている仮想マシン名と、電源状態の一覧が取得できました!
おわりに
LambdaからVMware Cloud on AWSのvCenterへのアクセスを試してみました。
今回は仮想マシン名と電源状態の取得を紹介しましたが、作り込み次第で何でもできそうです!
今後、実際に採用できそうな構成も作ってみて紹介できればと思います。
このエントリが誰かの助けになれば幸いです。
それでは、AWS事業本部 コンサルティング部の荒平(@0Air)がお送りしました!